package com.tiance.demo.service.mysql.analyzer.pageundolog;

import com.tiance.demo.service.mysql.bo.pageundolog.UndoLogPageHeader;
import com.tiance.demo.service.mysql.constants.UndoLogPageType;
import com.tiance.demo.service.mysql.utils.ByteUtils;

public class UndoLogPageHeaderAnalyzer {

    public static UndoLogPageHeader analyse(byte[] bytes) {
        UndoLogPageHeader undoLogPageHeader = new UndoLogPageHeader();
        undoLogPageHeader.setBytes(bytes);

        analyseTrxUndoPageType(undoLogPageHeader);
        analyseTrxUndoPageStart(undoLogPageHeader);
        analyseTrxUndoPageFree(undoLogPageHeader);
        analyseTrxUndoPageNode(undoLogPageHeader);

        return undoLogPageHeader;
    }

    private static void analyseTrxUndoPageType(UndoLogPageHeader undoLogPageHeader) {
        byte[] bytes = new byte[2];
        System.arraycopy(undoLogPageHeader.getBytes(), 0, bytes, 0, 2);

        int trxUndoPageType = ByteUtils.bytes2Int(bytes);
        undoLogPageHeader.setTrxUndoPageType(trxUndoPageType);

        if (trxUndoPageType == UndoLogPageType.INSERT.getUndoType()) {
            undoLogPageHeader.setTrxUndoPageTypeDesc(UndoLogPageType.INSERT.getUndoTypeDesc());
        } else if (trxUndoPageType == UndoLogPageType.UPDATE.getUndoType()) {
            undoLogPageHeader.setTrxUndoPageTypeDesc(UndoLogPageType.UPDATE.getUndoTypeDesc());
        }
    }

    private static void analyseTrxUndoPageStart(UndoLogPageHeader undoLogPageHeader) {
        byte[] bytes = new byte[2];
        System.arraycopy(undoLogPageHeader.getBytes(), 0, bytes, 0, 2);

        int trxUndoPageStart = ByteUtils.bytes2Int(bytes);
        undoLogPageHeader.setTrxUndoPageStart(trxUndoPageStart);
    }

    private static void analyseTrxUndoPageFree(UndoLogPageHeader undoLogPageHeader) {
        byte[] bytes = new byte[2];
        System.arraycopy(undoLogPageHeader.getBytes(), 0, bytes, 0, 2);

        int trxUndoPageFree = ByteUtils.bytes2Int(bytes);
        undoLogPageHeader.setTrxUndoPageFree(trxUndoPageFree);
    }

    private static void analyseTrxUndoPageNode(UndoLogPageHeader undoLogPageHeader) {
        byte[] bytes = new byte[12];
        System.arraycopy(undoLogPageHeader.getBytes(), 0, bytes, 0, 12);

        String trxUndoPageNode = ByteUtils.bytes2HexStr(bytes);
        undoLogPageHeader.setTrxUndoPageNode(trxUndoPageNode);
    }
}
